package Algorithm.SortAlgorithm;

/**
 * @Author self
 * @Date 2024/10/28 21:30
 * @Describe
 */
/**
 * 选择排序类
 */
public class SelectSort {

    /**
     * 对整数数组进行选择排序
     *
     * @param nums 待排序的整数数组
     * @return 排序后的整数数组
     */
    public int[] selectSort(int[] nums) {
        // 检查数组是否为空或长度为0，如果是，则直接返回数组
        if (nums == null || nums.length == 0) {
            return nums;
        }
        // 获取数组长度
        int len = nums.length;
        // 遍历数组，进行选择排序
        for (int i = 0; i < len; i++) {
            // 找到从索引i开始到数组末尾的最小值的索引
            int minIndex = findMinNum(i, len, nums);
            // 将最小值与索引i的值交换
            swap(i, minIndex, nums);
        }
        // 返回排序后的数组
        return nums;
    }

    /**
     * 交换数组中两个指定索引的元素
     *
     * @param i 第一个元素的索引
     * @param j 第二个元素的索引
     * @param nums 包含要交换元素的数组
     */
    private void swap(int i, int j, int[] nums) {
        // 临时变量用于交换
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }

    /**
     * 找到从指定起始索引到指定结束索引内的最小元素的索引
     *
     * @param from 起始索引
     * @param len 数组长度
     * @param nums 要查找的数组
     * @return 最小元素的索引
     */
    private int findMinNum(int from, int len, int[] nums) {
        // 初始化最小值索引为起始索引
        int minIndex = from;
        // 遍历数组，寻找最小值索引
        for (int j = from + 1; j < len; j++) {
            // 如果找到更小的值，更新最小值索引
            if (nums[j] < nums[minIndex]) {
                minIndex = j;
            }
        }
        // 返回最小值索引
        return minIndex;
    }

    /**
     * 主函数，用于测试选择排序
     */
    public static void main(String[] args) {
        // 初始化一个整数数组
        int[] arr = new int[]{1,3,2,6,4};
        // 创建选择排序实例
        SelectSort selectSort = new SelectSort();
        // 对数组进行排序
        selectSort.selectSort(arr);
        // 遍历并打印排序后的数组
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

